package com.doyoulike.service.gen;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import com.doyoulike.entity.GenTable;
import com.doyoulike.entity.GenTableChild;
import com.doyoulike.entity.GenTableColumn;
import com.doyoulike.util.ColumnUtil;
import com.doyoulike.vo.out.GenChildModel;
import com.doyoulike.vo.out.GenData;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author duzhou
 * @version 2021/12/23
 */
public class GenVOBuild {

    private static final String TIMESTAMP = "Timestamp";
    private static final String DATE = "Date";
    private static final List<String> HAS_DATE = Arrays.asList("Date", "Timestamp", "LocalDate", "LocalDateTime");
    private static final String BIGDECIMAL = "BigDecimal";

    public static GenData build(GenTable genTable) {
        return convertToGenVO(genTable);
    }

    /**
     * 将 GenTable 转为 GenVO
     */
    public static GenData convertToGenVO(GenTable genTable) {
        GenData gen = new GenData();
        gen.setPackagePath(genTable.getPackagePath());         // 包路径
        gen.setAuthor(genTable.getFunctionAuthor());           // 作者
        gen.setDate(LocalDate.now().toString());               // 生成日期
        gen.setTableName(genTable.getName());                  // 表名
        gen.setClassName(genTable.getClassName());             // 类名
        gen.setObjectName(ColumnUtil.toCamelCaseFirst(genTable.getClassName()));  // 对象名（Product --> product）
        gen.setColumnList(genTable.getColumnList());           // 列
        gen.setModuleName(genTable.getModuleName());           // 模块名称
        gen.setSubModuleName(genTable.getSubModuleName());     // 子模块名称
        gen.setFunctionName(genTable.getChName());             // 功能名称
        gen.setFunctionVersion(DateUtil.today());              // 版本（日期）
        gen.setHasBigDecimal(false);                           // 是否包含 BigDecimal
        gen.setHasDate(false);                                 // 是否包含 Date
        gen.setHasList(false);                                 // 是否包含 List
        检查是否存在BIgDecimal和Data和List(genTable, gen);
        gen.setChilds(getGenChildModels(genTable, gen)); // 子表数据
        return gen;
    }

    /**
     * 检查列数据是否存在BIgDecimal和Data和List
     */
    private static void 检查是否存在BIgDecimal和Data和List(GenTable genTable, GenData gen) {
        for (GenTableColumn column : gen.getColumnList()) {
            if (BIGDECIMAL.equals(column.getJavaType())) {
                gen.setHasBigDecimal(true);
            }
            // if (TIMESTAMP.equals(column.getJavaType()) || DATE.equals(column.getJavaType())) {
            if (HAS_DATE.contains(column.getJavaType())) {
                gen.setHasDate(true);
            }
            if (CollectionUtil.isEmpty(genTable.getGenTableChilds())) {
                gen.setHasList(true);
            }
        }
    }

    /**
     * 组装子表数据
     * @param genTable
     * @return
     */
    private static List<GenData> getGenChildModels(GenTable genTable, GenData parent) {
        if(CollectionUtil.isEmpty(genTable.getGenTableChilds())) return new ArrayList<>();

        List<GenData> childs = new ArrayList<>(genTable.getGenTableChilds().size());
        for (GenTableChild genTableChild : genTable.getGenTableChilds()) {
            GenData genChildModel = new GenChildModel();
            genChildModel.setPackagePath(genTableChild.getTable().getPackagePath());     // 包路径
            genChildModel.setAuthor(genTableChild.getTable().getFunctionAuthor());       // 作者
            genChildModel.setDate(LocalDate.now().toString());                           // 生成日期
            genChildModel.setTableName(genTableChild.getTable().getName());              // 表名
            genChildModel.setClassName(genTableChild.getTable().getClassName());         // 类名
            genChildModel.setObjectName(ColumnUtil.toCamelCaseFirst(genTableChild.getTable().getClassName()));  // 对象名（Product --> product）
            genChildModel.setColumnList(genTableChild.getTable().getColumnList());       // 列
            genChildModel.setModuleName(genTableChild.getTable().getModuleName());       // 模块名称
            genChildModel.setSubModuleName(genTableChild.getTable().getSubModuleName()); // 子模块名称
            genChildModel.setFunctionName(genTableChild.getTable().getChName());         // 功能名称
            genChildModel.setFunctionVersion(DateUtil.today());                          // 版本（日期）
            genChildModel.setHasBigDecimal(false);                                       // 是否包含 BigDecimal
            genChildModel.setHasDate(false);                                             // 是否包含 Date
            genChildModel.setHasList(false);                                             // 是否包含 List
            for (GenTableColumn column : genChildModel.getColumnList()) {
                if (BIGDECIMAL.equals(column.getJavaType())) {
                    genChildModel.setHasBigDecimal(Boolean.TRUE);
                }
                if (TIMESTAMP.equals(column.getJavaType()) || DATE.equals(column.getJavaType())) {
                    genChildModel.setHasDate(Boolean.TRUE);
                }
            }
            genChildModel.setParent(parent);
            genChildModel.setChildTableField(genTableChild.getField()); 	             // 子表字段（子表中主表的外键）
            genChildModel.setChildTableMainField(genTableChild.getMainField());          // 主表字段（主表中与子表外键对应的字段）
            childs.add(genChildModel);
        }
        return childs;
    }

}
